package top.MiraiJavaEasy.Event;

import net.mamoe.mirai.event.ConcurrencyKind;
import net.mamoe.mirai.event.Event;
import net.mamoe.mirai.event.EventPriority;

/**
 * MiraiJavaEasy的事件处理接口，你的事件处理类都应该继承该接口。
 *
 * @param <T> T需要选择一个继承 net.mamoe.mirai.event.Event 接口的类，确保是一个可以被监听的事件
 * @see Event
 */
public interface MiraiJavaEasyEvent<T extends Event> {
    /**
     * 主要阶段触发的函数
     * @param MiraiEvent mirai事件对象
     * @throws Exception 抛出的异常
     */
    void Start(T MiraiEvent) throws Exception;

    /**
     * 异常处理阶段函数
     * 当Awake，OnEnable，Start，End函数中有抛出异常时触发
     *
     * @param MiraiEvent mirai事件对象
     * @param e          被抛出的异常
     */
    void Catch(T MiraiEvent, Exception e);

    /**
     * 无论如何，这是在整个事件最后触发的函数
     *
     * @param MiraiEvent mirai事件对象
     */
    void Finally(T MiraiEvent);

    /**
     * 该函数用于输出类上的泛型类型，请手动填入
     *
     * @return 泛型类型
     */
    Class<T> getEventClass();

    /**
     * 设置事件的并发模式
     * <p>
     * 并发地同时处理多个事件, 但无法保证 Listener.onEvent 返回 ListeningStatus.STOPPED 后立即停止事件监听
     * ConcurrencyKind.CONCURRENT
     * <p>
     * 使用 Mutex 保证同一时刻只处理一个事件.
     * ConcurrencyKind.LOCKED
     *
     * @return 事件的并发模式
     * @see ConcurrencyKind
     */
    ConcurrencyKind getConcurrencyKind();

    /**
     * 设置事件的优先级
     * 在广播时, 事件监听器的调用顺序为 (从左到右): HIGHEST -> HIGH -> NORMAL -> LOW -> LOWEST -> MONITOR
     *
     * @return 事件的优先级
     * @see EventPriority
     */
    EventPriority getEventPriority();
}
